import {IMathAdapter, mathAdapter} from "../../adapterInterface/util/IMathAdapter";
import {CodeUtil} from "../../../../codeAdapter/CodeUtil";

export class MathAdapter implements IMathAdapter {
    abs(x: number): number {
        return IAbsBJ(x);
    }

    acos(x: number): number {
        return  AcosBJ(x);
    }

    asin(x: number): number {
        return  AsinBJ(x);
    }

    atan(x: number): number {
        return  AtanBJ(x);
    }

    atan2(y: number, x: number): number {
        return  Atan2BJ(y, x);
    }

    ceil(x: number): number {
        // let newNum = x;
        // let str = `${x}`;
        // const index = str.indexOf('.');
        // if (index >= 0) {
        //     const prefix = str.slice(0, index);
        //     const suffix = str.slice(index, str.length);
        //     newNum = this.toNumber(prefix);
        //     const float = this.toNumber(suffix);
        //     if (!CodeUtil.isNullOrZero(float)) {
        //         newNum = newNum + 1;
        //     }
        // }
        return Math.ceil(x)
    }

    cos(x: number): number {
        return  CosBJ(x);
    }

    floor(x: number): number {
        // let newNum = x;
        // let str = `${x}`;
        // const index = str.indexOf('.');
        // if (index >= 0) {
        //     const prefix = str.slice(0, index);
        //     newNum = this.toNumber(prefix);
        // }
        return Math.floor(x)
    }

    getPI(): number {
        return  Math.PI;
    }

    random(min: number, max: number): number {
        return GetRandomInt(min, max);
    }

    randomReal(min: number, max: number): number {
        return GetRandomReal(min, max);
    }

    round(x: number): number {
        // if (x) {
        // } else {
        //     return 0;
        // }
        // let newNum = x;
        // let str = `${x}`;
        // const index = str.indexOf('.');
        // if (index >= 0) {
        //     const prefix = str.slice(0, index);
        //     const suffix = str.slice(index + 1, index + 2);
        //     newNum = this.toNumber(prefix);
        //     const suffixNum = this.toNumber(suffix);
        //     if (suffixNum > 4) {
        //         newNum = newNum + 1;
        //     }
        // }
        return Math.round(x)
    }

    sin(x: number): number {
        return SinBJ(x);
    }

    sqrt(x: number): number {
        return SquareRoot(x);
    }

    tan(x: number): number {
        return TanBJ(x);
    }

    toFixed(number: number, fixNum: number): number {
        let newNum = number;
        let str = `${number}`;
        const index = str.indexOf('.');
        if (index >= 0) {
            str = str.slice(0, index + fixNum);
            newNum = this.toNumber(str);
        }
        return newNum
    }

    min(...values: number[]): number {
        return Math.min(...values);
    };
    max(...values: number[]): number {
        return Math.max(...values);
    };

    toNumber(obj: any): number {
        return tonumber(obj);
    }

    toString(obj: any): string {
        return tostring(obj);
    }
}